/**
 * 用户控制器
 * 处理所有与用户相关的业务逻辑
 * 
 * 包含功能：
 * 1. 用户注册
 * 2. 用户登录
 * 3. 密码重置
 * 4. 个人资料管理
 */

const User = require('../models/user.model');
const jwt = require('jsonwebtoken');
const nodemailer = require('nodemailer');
const validator = require('validator');

/**
 * 邮件发送配置
 * 用于发送密码重置等系统邮件
 */
const transporter = nodemailer.createTransport({
  host: process.env.SMTP_HOST,
  port: process.env.SMTP_PORT,
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS
  }
});

/**
 * 生成JWT令牌
 * @param {string} userId - 用户ID
 * @returns {string} JWT令牌
 */
const generateToken = (userId) => {
  return jwt.sign({ id: userId }, process.env.JWT_SECRET, {
    expiresIn: process.env.JWT_EXPIRES_IN
  });
};

/**
 * 用户注册
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.register = async (req, res) => {
  try {
    const { username, email, password } = req.body;
    
    // 检查邮箱是否已存在
    const existingUser = await User.findByEmail(email);
    if (existingUser) {
      return res.status(400).json({ message: '该邮箱已被注册' });
    }

    // 创建新用户
    const userId = await User.create({ username, email, password });
    
    res.status(201).json({ 
      message: '注册成功',
      user: { id: userId, username, email }
    });
  } catch (error) {
    console.error('Registration error:', error);
    res.status(500).json({ message: '注册失败，请稍后重试' });
  }
};

/**
 * 用户登录
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.login = async (req, res) => {
  try {
    const { email, password } = req.body;
    console.log('Login attempt:', { account: email });

    // 验证输入
    if (!email || !password) {
      console.log('Missing credentials');
      return res.status(400).json({ message: '请输入账号和密码' });
    }

    // 查找用户
    const user = await User.findByEmailOrUsername(email);
    console.log('User found:', !!user);

    if (!user) {
      return res.status(401).json({ message: '账号或密码错误' });
    }

    // 验证密码
    const isMatch = await User.comparePassword(password, user.password);
    console.log('Password match:', isMatch);

    if (!isMatch) {
      return res.status(401).json({ message: '账号或密码错误' });
    }

    // 生成令牌
    const token = jwt.sign(
      { id: user.id },
      process.env.JWT_SECRET,
      { expiresIn: '24h' }
    );
    
    // 准备响应数据
    const userResponse = {
      id: user.id,
      username: user.username,
      email: user.email
    };

    res.json({
      token,
      user: userResponse,
      message: '登录成功'
    });
  } catch (error) {
    console.error('Login error:', error);
    res.status(500).json({ message: '服务器错误，请稍后重试' });
  }
};

/**
 * 忘记密码处理
 * 发送密码重置邮件
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.forgotPassword = async (req, res) => {
  try {
    const { email } = req.body;
    const user = await User.findByEmail(email);

    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }

    // 生成重置令牌
    const resetToken = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: '1h' });
    const resetUrl = `http://8.218.216.246:8089/reset-password?token=${resetToken}`;

    // 发送重置邮件
    await transporter.sendMail({
      from: process.env.SMTP_FROM,
      to: email,
      subject: '密码重置请求',
      html: `
        <p>您收到此邮件是因为您（或其他人）请求重置密码。</p>
        <p>请点击以下链接重置密码：</p>
        <a href="${resetUrl}">${resetUrl}</a>
        <p>如果您没有请求重置密码，请忽略此邮件。</p>
      `
    });

    res.json({ message: '重置密码邮件已发送，请查收' });
  } catch (error) {
    console.error('Forgot password error:', error);
    res.status(500).json({ message: '发送重置邮件失败，请稍后重试' });
  }
};

/**
 * 重置密码
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.resetPassword = async (req, res) => {
  try {
    const { token, newPassword } = req.body;
    
    // 验证令牌
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    const user = await User.findById(decoded.id);

    if (!user) {
      return res.status(404).json({ message: '用户不存在' });
    }

    // 更新密码
    await User.updatePassword(user.id, newPassword);
    res.json({ message: '密码重置成功' });
  } catch (error) {
    console.error('Reset password error:', error);
    res.status(500).json({ message: '密码重置失败，请重试' });
  }
};

/**
 * 更新用户资料
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.updateProfile = async (req, res) => {
  try {
    const userId = req.user.id;
    const updates = req.body;
    
    // 更新用户信息
    await User.update(userId, updates);
    const updatedUser = await User.findById(userId);
    
    res.json({
      message: '个人资料更新成功',
      user: updatedUser
    });
  } catch (error) {
    console.error('Update profile error:', error);
    res.status(500).json({ message: '更新失败，请稍后重试' });
  }
};

/**
 * 删除用户账户
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 */
exports.deleteAccount = async (req, res) => {
  try {
    const userId = req.user.id;
    
    // 删除用户账户
    await User.delete(userId);
    res.json({ message: '账户已成功删除' });
  } catch (error) {
    console.error('Delete account error:', error);
    res.status(500).json({ message: '删除账户失败，请稍后重试' });
  }
};
